猴子请来的救兵 2018-01-17 21:00:32

容器

创建容器

使用『docker create』来创建容器,但是这种创建方法不会启动容器,创建好了的容器是『stop』状态

docker create -it centos

使用『docker run』来创建并启动容器

# 使用容器中的『echo』打印『Hello』后,自动停止容器
docker run -it centos /bin/echo "Hello"

# 会执行容器shell命令,进入交互模式,进行命令行操作
docker run -it centos /bin/bash

# 可以使用-d参数,进入守护状态模式下运行容器,一般使用-d都是运行服务
docker run -d centos /bin/bash

查看容器

可以使用『docker ps』来查看容器状态

docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
463d6a3ba419        centos              "/bin/echo Hello"   7 seconds ago       Exited (0) 5 seconds ago                       lucid_knuth
2ae596744334        test                "/bin/bash"         3 hours ago         Created                                        vigilant_lumiere
名称 描述
CONTAINER ID 容器的唯一ID
IMAGE 容器名字
COMMAND 运行容器时的指令
CREATED 创建时间
STATUS 容器的状态,Sleep、Stop、Exited、Running
PORTS 容器映射的端口
NAMES 容器名称,在创建容器时未指定名称,系统会随机取名

终止容器

可以使用『docker stop』来终止一个正在运行的容器

docker stop [img_id]

启动容器

终止的容器可以使用『docker start』来启动容器

docker start [img_id]

进入容器

在使用『-d』参数时,容器启动后会进入后台,用户无法看到容器中的信息。某些时候如果要进入容器进行操作有很多种方法『docker attach』、『docker exec』、『nsenter』工具等。

  1. 『docker attach』这个命令有时候并不方便,当多个窗口同时『attach』时,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

    docker attach [img_id]
  2. 『docker exec』自从 Docker 1.3 版本起,提供了一个更加方便的工具 exec ,可以直接在容器内运行命令。像下列命令就是进入它的『/bin/bash』交互模式

    docker exec -it [img_id] /bin/bash
  3. 『nsenter』工具在 util-linux 2.23 版本后包含的。如果系统中 util-linux 包没有该命令,可以按照下面的方法从源码安装

    cd /tmp
    curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-
    cd util-linux-2.24
    ./configure --without-ncurese
    make nserter && cp nserter /usr/local/bin

    下列列出进入容器的完整例子

    $ sudo docker run -idt ubuntu
    243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
    
    $ sudo docker ps
    CONTAINER ID    IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES
    243c32535da7    ubuntu:latest       "/bin/bash"          18 seconds ago
    Up 17 seconds                       nostalgic_hypatia
    
    $ PID=$(docker-pid 243c32535da7)
    10981
    
    $ sudo nsenter --target 10981 --mount --uts --ipc --net --pid
    
    root@243c32535da7:/#
    
    root@ce554267d7a4:/# w
    11:07:36 up  3:14,  0 users,  load average: 0.00, 0.02, 0.05
    USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
    
    root@ce554267d7a4:/# ps -ef
    #通过ps -ef命令可以看到容器中运行的进程
    UID        PID  PPID  C STIME TTY          TIME CMD
    root      1     0  0 10:56 ?           00:00:00 /bin/sh -c while true; do echo
    hello world; sleep 1; done
    root       699     0  0 11:07 ?        00:00:00 /bin/bash
    root       716     1  0 11:07 ?        00:00:00 sleep 1
    root       717   699  0 11:07 ?        00:00:00 ps -ef
    

删除容器

可以使用『docker rm』命令在删除终止状态的容器

docker rm [opt] [img_id]
[opt] 操作 描述
-f, —force=false 强制终止并且删除一个运行中的容器
-l, —link=false 删除容器链接,但是保留容器
-v, —volumes=false 删除容器挂载的数据卷

导入和导出容器

  1. 『docker export』导出容器

    可以导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态

    docker export [img_id] > test_for_run.tar
  2. 『docker import』导入容器

    导出的容器可以使用导入命令,导入成镜像

    docker import test_for_run.tar

容器『import』与『load』的区别

实际上,既可以使用『docker load』命令来导入镜像储存文件到本地的镜像仓库,又可以使用『docker import』命令来导入一个容器快照到本地镜像仓库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息,而镜像储存文件将保存完整记录,体积也要大一些。此外,从容器快照文件导入时可以重新制定标签等元数据信息。

创建镜像

使用『docker commit』来通过已有的,高质量的容器,将它储存为镜像

docker commit -m "Add a new img" -a "Docker newbee" [img_id] [img_name]

以下我们先运行一个容器,在这个容器里面创建一个test文件,再把这个容器储存为镜像

docker run -it centos /bin/bash
docker commit -m "Add a new file" -a "Docker Newbee" 936f3c58b5b5 test